Skip to content

sweep(spec): three self-descriptions re-anchored to a verifiable source of truth (#6242 #4895 #4837) - #7032

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-7024-ledger-truth-sweep
Aug 9, 2026
Merged

sweep(spec): three self-descriptions re-anchored to a verifiable source of truth (#6242 #4895 #4837)#7032
os-zhuang merged 2 commits into
mainfrom
claude/issue-7024-ledger-truth-sweep

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #6242
Fixes #4895
Fixes #4837

Sweep card #7024. All three members completed; none dropped. Shared criterion: each member is a self-description that stopped being answerable to reality, and each fix re-anchors it to something checkable.

Per-item checklist

1. #6242 — eight enumerations of the stack-collection set, none answerable to stack.zod.ts

落点 scripts/check-stack-collection-maps.mjs (new), package.json, .github/workflows/lint.yml, packages/metadata/src/plugin.ts

before ObjectStackDefinitionSchema declares 32 collections. Seven other places re-enumerate that set by hand (eight enumerations — ObjectQL declares its list twice), and nothing compared any of them to the schema or to each other. ragPipelines mapped in three sites though no schema declares it; workflows/approvals/roles/profiles/policies still iterated by both ObjectQL loops after four ADRs retired them; triggers+workflows still legal artifact categories; 19 of 32 collections absent from that enum; ARTIFACT_FIELD_TO_TYPE aimed the seed collection (data:) at the analytics kind name ('dataset').

after pnpm check:stack-collection-maps derives the set from the schema (top-level keys whose value is z.array(<X>Schema) — mechanical, not a second hand-kept list) and reconciles all eight enumerations against it in both directions. Deviations are legal only as waiver rows carrying a reason, and the list is a ratchet: a waiver that no longer applies fails, like a stale ledger row. An enumeration whose symbol cannot be extracted fails too — an empty list would reconcile against everything. 19 waiver rows landed, each written from the gate's own output. One code change: the data: 'dataset' entry is removed (provably inert — SeedSchema declares no name and the ingest loop skips nameless items — so no runtime change; not repointed at 'seed', which would be new behaviour).

Two things the gate found that the hand-audit had not:

2. #4837 — the ledger counted "a consumer read site exists" as live evidence

落点 packages/spec/scripts/liveness/producer.mts (+ test, new), check-liveness.mts, liveness/README.md, liveness/{seed,job,hook}.json

before A live verdict needed only a consumer pointer. Seed.env was live on a correct one (filterByEnv) while none of the six call sites building a SeedLoaderRequest passed env — so the filter returned its input on its first line and dataset.env was never read. seed-loader.test.ts passed throughout, because it supplies config.env itself.

after The criterion is written in the README: when a property's effect depends on a second input somebody must supply, live requires producer-side evidence. New producer field, resolved through the same resolver as evidence (a repo-local path that does not exist fails CI). Absence never fails — check:liveness --producer-gap prints the worklist, and a table says which shapes actually need one. A malformed value fails, same asymmetry as verifiedAt. Six entries re-verified by hand: seed.env (restamped, both sides cited), and job.timeout + hook.retryPolicy/timeout/onError — the same "read out of an options object built elsewhere" shape, checked and holding (the scheduler threads {retryPolicy, timeout}; the hook binder hands the authored hook to the wrapper). No mass re-grade, and no status flipped.

3. #4895 — the #4667 liveness verdicts' cross-repo coverage

落点 producer.mts (evidenceScope), check-liveness.mts, liveness/README.md, liveness/{app,book}.json

before Task 2 (the homePageId tombstone prose) landed in #4709. Tasks 1 and 3 were open: the #4667 batch had never been re-verified cross-repo, and no entry could say how wide its last look was.

after New evidenceScope: "in-repo" | "cross-repo", with the README recording the four measured blind-spot cases and the method they force (a negative cross-repo claim must follow the resolved symbol graph through re-export chains — case 4, Notification, proves no specifier match suffices). Task 1 done: all six keys of the #4667 batch re-verified against objectui @c2fd1223.

#4667 key cross-repo verdict
app.homePageId confirmed — objectui now REJECTS the key in OuiAppSchema (pin test), AppPreview ignores it (pin test), resolveLandingRoute() documents the removal, RootLandingRedirect routes on isDefault
app.areas[].order confirmed — no renderer sorts areas; AppSchemaRenderer, AppSidebar, UnifiedSidebar all iterate array order and only filter
book.translations / book.groups[].translations confirmed — objectui models the spine independently (apps/console/src/pages/book-nav.ts) and neither Book nor BookGroup declares translations
job.id confirmed — objectui loads JobSchema only for client-side metadata-admin validation; no reader of id
translation.validationMessages confirmed, with a nuance already recorded in this repo: objectui's spec-translations.ts transports the key into the client i18n tree and TranslationPreview echoes it, but nothing resolves it. translation.zod.ts:320 already says exactly this — no correction owed

No counter-example found, which is the honest outcome of task 1 rather than a null result: the two surviving tombstone rows now carry evidenceScope: cross-repo and the pinned commit. Task 3 is the field itself.

⛔ Acceptance face — untouched

packages/spec/authorable-surface.base.json is byte-identical (no schema key added, removed or retired). check:authorable-surface green. Three of the drift rows #6242 reports sit on acceptance faces (MetadataCategoryEnum decides what a published artifact may declare); they are recorded as waivers with their reason rather than fixed, per the sweep's red line.

Zero changes outside the member items

git diff --stat origin/main...HEAD, mapped 1:1:

file member
scripts/check-stack-collection-maps.mjs (new, +832) 1
package.json (+1), .github/workflows/lint.yml (+12) 1 (gate wiring)
packages/metadata/src/plugin.ts (+19/−4) 1 (data: removal + pin comment)
.changeset/stack-collection-maps-answerable.md (new) 1
packages/spec/scripts/liveness/producer.mts + .test.ts (new) 2 + 3
packages/spec/scripts/liveness/check-liveness.mts (+80) 2 + 3
packages/spec/liveness/README.md (+100) 2 + 3
packages/spec/liveness/{seed,job,hook}.json 2
packages/spec/liveness/{app,book}.json 3
.changeset/liveness-producer-and-evidence-scope.md (new) 2 + 3

Verification record

Coverage limit worth stating

cross-repo here means objectui only. The cloud runtime is not reachable from an open-source checkout, so no verdict in this sweep claims coverage of it — the README says so where the value is defined, rather than letting cross-repo read as "everywhere".


Generated by Claude Code

zhuangjianguo and others added 2 commits August 9, 2026 10:16
…le source of truth (#7024)

Sweep card #7024 — every member is a self-description that stopped being
answerable to reality, and each fix re-anchors it to something checkable.

#6242 — eight enumerations of the stack-collection set, none answerable to
`stack.zod.ts`. New `pnpm check:stack-collection-maps` derives the set from
`ObjectStackDefinitionSchema` and reconciles all eight against it in both
directions; every deviation is a waiver row carrying its reason, and a stale
waiver fails like a stale ledger row. Writing it found a seventh site the
hand-audit missed (`APP_CATEGORY_KEYS`) and a divergence between ObjectQL's two
copies that neither list shows alone. One code change: `ARTIFACT_FIELD_TO_TYPE`
no longer aims the seed collection (`data:`) at the analytics kind
(`'dataset'`) — a provably inert entry pointed at the wrong kind.

#4837 — the ledger counted "a consumer read site exists" as `live` evidence,
which misses producer-less dead keys (`Seed.env`). Adds the `producer` field
(resolved like `evidence`, so a call-site claim cannot rot), the criterion in
liveness/README.md, and a `--producer-gap` worklist. Six entries re-verified by
hand; `seed.env` restamped with both sides cited.

#4895 — adds `evidenceScope` (`in-repo` | `cross-repo`), and re-verifies the
#4667 retirement batch cross-repo against objectui @c2fd1223: all six keys
confirmed, no counter-example. The two surviving tombstone rows carry the scope
and the pinned commit.

⛔ Zero acceptance-face changes: authorable-surface.base.json is untouched, and
the three drift rows that sit on acceptance faces are recorded as waivers rather
than fixed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y3ydyJV9reKBgoez8LAoqY
@vercel

vercel Bot commented Aug 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 9, 2026 10:31am

Request Review

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/metadata, @objectstack/spec.

114 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata, packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via packages/metadata, @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/metadata-service.mdx (via @objectstack/metadata)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation ci/cd dependencies Pull requests that update a dependency file tests tooling labels Aug 9, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 9, 2026 11:44
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 9, 2026
Merged via the queue into main with commit 3de535b Aug 9, 2026
28 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-7024-ledger-truth-sweep branch August 9, 2026 12:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment